package com.galen.manual.aspect;

import com.galen.manual.annotation.RequireAdminRole;
import com.galen.manual.common.Result;
import com.galen.manual.context.UserContextHolder;
import com.galen.manual.entity.User;
import com.galen.manual.mapper.UserMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 管理员权限验证切面
 * 用于验证方法调用者是否具有所需的管理员角色
 */
@Slf4j
@Aspect
@Component
@AllArgsConstructor
public class AdminRoleAspect {

    private final UserMapper userMapper;

    /**
     * 环绕通知：拦截带有@RequireAdminRole注解的方法
     *
     * @param joinPoint 连接点
     * @param requireAdminRole 权限注解
     * @return 方法执行结果
     * @throws Throwable 异常
     */
    @Around("@annotation(requireAdminRole)")
    public Object checkAdminRole(ProceedingJoinPoint joinPoint, RequireAdminRole requireAdminRole) throws Throwable {
        String requiredRole = requireAdminRole.value();
        String errorMessage = requireAdminRole.message();
        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getSimpleName();

        log.debug("开始验证管理员权限 - 类: {}, 方法: {}, 需要角色: {}", className, methodName, requiredRole);

        try {
            if (!UserContextHolder.isCurrentUserAdmin())
            {
                return Result.error("当前用户不是管理员");
            }
            // 获取当前管理员信息
            String currentRole = getCurrentAdmin().getAdminRole();
            // 验证角色权限
            if (!requiredRole.equals(currentRole)) {
                log.warn("权限验证失败 - 类: {}, 方法: {}, 当前角色: {}, 需要角色: {}",
                        className, methodName, currentRole, requiredRole);

                // 返回权限不足的错误结果
                return Result.error(errorMessage);
            }

            log.debug("权限验证通过 - 类: {}, 方法: {}, 当前角色: {}", className, methodName, currentRole);

            // 权限验证通过，继续执行原方法
            return joinPoint.proceed();

        } catch (Exception e) {
            log.error("权限验证过程中发生异常 - 类: {}, 方法: {}", className, methodName, e);

            // 如果是权限相关异常，返回权限错误
            if (e instanceof SecurityException || e.getMessage().contains("权限")) {
                return Result.error("权限验证失败：" + e.getMessage());
            }

            // 其他异常继续抛出
            throw e;
        }
    }

    /**
     * 获取当前管理员用户信息
     * @return 管理员用户信息
     * @throws RuntimeException 如果未登录或不是管理员
     */
    public User getCurrentAdmin() {
        Long userId = UserContextHolder.getCurrentUserId();
        if (userId == null) {
            throw new RuntimeException("管理员未登录");
        }

        Boolean isAdmin = UserContextHolder.isCurrentUserAdmin();
        if (isAdmin == null || !isAdmin) {
            throw new RuntimeException("当前用户不是管理员");
        }

        Integer status = UserContextHolder.getUserContext().getStatus();
        if (status != 1) {
            throw new RuntimeException("管理员账号已被禁用");
        }

        // 查询完整用户信息
        User user = userMapper.selectUserWithAdminInfo(userId);
        if (user == null) {
            throw new RuntimeException("管理员用户不存在");
        }

        return user;
    }
}